/*
 * @File    :   data_table.js
 * @Time    :   2024/03/21 19:03:27
 * @Author  :   chakcy
 * @Email   :   947105045@qq.com
 * @description   :   sqlite 单表操作
 */

class DataTable {
    constructor(mapperPath, db) {
        if (!db) {
            throw new Error('Missing database instance')
        }
        // 根据mapperPath引入对应的映射文件
        try {
            // 验证mapperPath并引入映射文件  
            this.mapper = require(mapperPath);
        } catch (err) {
            throw new Error(`Failed to load mapper file: ${err.message}`)
        }

        // 创建sqlite3数据库实例
        this.db = db
        this.initTable().catch(err => console.error(err.message))
    }

    async initTable() {
        try {
            await this.db.run(this.mapper.create)
            console.log(`'${this.mapper.tableName}' Table created successfully.`)
        } catch (err) {
            throw new Error(err.message)
        }
    }

    exit() {
        if (this.db) {
            this.db.close((err) => {
                if (err) {
                    return console.error(err.message)
                }
                console.log('Close the database connection.')
            })
        }
    }
    // 执行SQL语句
    /**
     * 注意：
     * 在execute方法中，params参数必须是一个数组，数组的每个元素
     * 是一个对象，对象中必须包含name和value两个属性，name属性是
     * 参数的名称，value属性是参数的值。
     * 例如：
     * [{name: "id", value: 1}, {name: "name", value: "Tom"}]
     */
    execute(sql_name, params) {
        if (!this.db) {
            throw new Error('Database instance is missing.')
        }
        const data = []
        // 检查参数是否匹配
        if (this.mapper[sql_name] === undefined) {
            return console.error(`Invalid SQL statement ${sql_name}`)
        }
        if (this.mapper[sql_name]["params"].length !== 0) {
            if (params.length !== this.mapper[sql_name]["params"].length) {
                return console.error("Invalid number of parameters")
            }
            params.forEach((item, index) => {
                if (this.mapper[sql_name]["params"][index] !== item["name"]) {
                    return console.error(`Invalid parameter ${item["name"]}`)
                }
                data.push(item["value"])
            })
            if (params.length > data.length) {
                return new Error("Invalid parameter")
            }
        }
        if (this.mapper[sql_name]["sql"].indexOf("SELECT") !== -1) {
            return new Promise((resolve, reject) => {
                this.db.all(this.mapper[sql_name]["sql"], data, (err, rows) => {
                    if (err) {
                        reject(err)
                    } else {
                        resolve(rows)
                    }
                })
            })
        } else {
            return new Promise((resolve, reject) => {
                this.db.run(this.mapper[sql_name]["sql"], data, (err) => {
                    if (err) {
                        reject(err)
                    } else {
                        resolve()
                    }
                })
            })
        }
        // 执行SQL语句并将结果传递给回调函数
    }
}

module.exports = {
    DataTable
}
